package com.campus.service.Impl;

import com.campus.constant.MessageConstant;
import com.campus.dto.SvgDTO;
import com.campus.entity.Route;
import com.campus.exception.SvgNameRepeatException;
import com.campus.mapper.SystemMapper;
import com.campus.result.PageResult;
import com.campus.service.SystemService;
import com.campus.vo.RoutersVO;
import com.campus.vo.SvgVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author TaiZai
 * @data 2024/10/20 20:36
 */
@Slf4j
@Service
public class SystemServiceImpl implements SystemService {

    @Autowired
    private SystemMapper systemMapper;

    /**
     * 获取路由信息
     * @return
     */
    @Override
    public List<RoutersVO> getRouters() {
        // 先获取所有的路由
        List<Route> routes = systemMapper.getRouters();

        // 构造路由数据并返回
        return buildRoutersVOS(routes);
    }

    private List<RoutersVO> buildRoutersVOS(List<Route> routes) {
        // 存储每个路由的映射
        Map<Integer, RoutersVO> routeMap = new HashMap<>();
        List<RoutersVO> routersVOS = new ArrayList<>();

        // 将 Route 转化为 RoutersVO，并存储在map中
        for (Route route : routes) {
            RoutersVO routersVO = RoutersVO.builder()
                    .path(route.getPath())
                    .name(route.getName())
                    .component(route.getComponent())
                    .redirect(route.getRedirect())
                    .meta(route.getMeta())
                    .children(new ArrayList<>())
                    .build();
            routeMap.put(route.getId(), routersVO);
        }

        // 组织父子关系
        for (Route route : routes) {
            if (route.getParentId() == null) {
                // 如果没有父路由，添加到结果列表
                routersVOS.add(routeMap.get(route.getId()));
            } else {
                // 如果有父路由，添加到父路由的 children 列表
                RoutersVO parent = routeMap.get(route.getParentId());
                if (parent != null) {
                    parent.getChildren().add(routeMap.get(route.getId()));
                }
            }
        }

        log.info("获取路由信息成功：{}", routersVOS);

        return routersVOS;
    }

    /**
     * 获取所有的svg图标名称
     * @return
     */
    @Override
    public PageResult getSVG(SvgDTO svgDTO) {
        // 设置分页参数
        PageHelper.startPage(svgDTO.getPage(), svgDTO.getPageSize());
        // 执行查询
        Page<SvgVO> page = systemMapper.pageQuery(svgDTO.getName());
        // 返回数据
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 添加svg
     * @param name
     */
    @Override
    public void addSVG(String name) {
        Map<Long, String> svg = systemMapper.getSVGByName(name);
        if (svg != null) {
            throw new SvgNameRepeatException(MessageConstant.SVG_NAME_REPEAT);
        }
        // 添加名称
        systemMapper.addSVG(name);
    }
}
